//
// Copyright (c) 2024 BPer
//
#ifndef SRC_BPERRTP_BPERRTPRECVNACK_H_
#define SRC_BPERRTP_BPERRTPRECVNACK_H_


#include <bperrtp/BPerReceiveNackBuffer.h>
#include <bperrtp/BPerRtcpNack.h>



typedef struct BPerNackOption
{
    int32_t maxReqCount;
    int64_t maxAliveTime;
    int64_t firstNackInterval;
    int64_t nackInterval;

    int64_t maxNackInterval;
    int64_t minNackInterval;
    int64_t nackCheckInterval;
}BPerNackOption;

typedef struct BPerRtpNackInfo
{
	 uint16_t sn;
    int64_t generateTime;
    // control nack interval.
    int64_t preReqNackTime;
    // control nack times.
    int32_t reqNackCount;

}BPerRtpNackInfo;

typedef struct {
	uint32_t vsize;
	uint32_t capacity;
	BPerRtpNackInfo* nackinfos;

}BPerRtpNackInfoList;

typedef struct BPerRtpRecvNack{
	int32_t rtt;
	int64_t preCheckTime;
	size_t maxQueueSize;		      // Max nack count.
	BPerReceiveNackBuffer* rtp;
	BPerNackOption opts;
	BPerRtcpCommon rtcp;
	BPerRtpNackInfoList queue;
}BPerRtpRecvNack;

#ifdef __cplusplus
extern "C"{
#endif
void bPer_create_nackinfo(BPerRtpNackInfo* nackinfo,uint16_t seq);
void bPer_nackinfo_erase(BPerRtpRecvNack* nack,uint16_t seq);

void bPer_create_nackinfovec(BPerRtpNackInfoList* nackvec,uint32_t capacity);
void bPer_destroy_nackinfovec(BPerRtpNackInfoList* nackvec);

void bPer_create_recvnack(BPerRtpRecvNack* nack, BPerReceiveNackBuffer* rtp,size_t queue_size);
void bPer_destroy_recvnack(BPerRtpRecvNack* nack);
void bPer_recvnack_initvec(BPerRtpRecvNack* nack,uint32_t ssrc);
void bPer_recvnack_insert(BPerRtpRecvNack* nack,uint16_t first, uint16_t last);
BPerRtpNackInfo* bPer_recvnack_find(BPerRtpRecvNack* nack,uint16_t seq);
void bPer_recvnack_update_rtt(BPerRtpRecvNack* nack,int32_t rtt);
void bPer_recvnack_remove(BPerRtpRecvNack* nack,uint16_t seq);
int32_t bPer_recvnack_isEmpty(BPerRtpRecvNack* nack);
void bPer_recvnack_get_nack_seqs(BPerRtpRecvNack* recvnack,BPerRtcpNack* nack, uint32_t* timeout_nacks);
void bPer_recvnack_check_queue_size(BPerRtpRecvNack* nack);
#ifdef __cplusplus
}
#endif
#endif /* SRC_BPERRTP_BPERRTPRECVNACK_H_ */
